package aplicacion;
import java.io.*;
import java.util.*;

public class ClashArchivos
{
	public static final char M = 'M';
	private static ArrayList<String> tableroPrevio=new ArrayList<String>();
	private static HashMap<String, String> fichas = new HashMap<>();
	
	public static boolean interpretaArchivo(File f) throws ClashExcepcion{
		boolean terminoLeer=false;
		boolean esCorrectoElArchivo=true;
		try{
			BufferedReader in = new BufferedReader(new FileReader(f.getPath())); 
			String archivo;
			String subarchivo="";			
			archivo = in.readLine();
			while (archivo!=null && archivo.length() >=2 && !terminoLeer){
				while(archivo.substring(0,2).contentEquals("--")){
					archivo=in.readLine();
					}
				switch(archivo){
					case "PEONES":
						subarchivo=readInLines(subarchivo,in);
						break;
					case "CAPITANES":
						subarchivo=readInLines(subarchivo,in);
						break;
					case "GENERALES":
						subarchivo=readInLines(subarchivo,in);
						break;
					case "TABLERO":	
						subarchivo=in.readLine();
						while(subarchivo!= null){							
							tableroPrevio.add(subarchivo);	
							subarchivo=in.readLine();
						}
						in.close();
						terminoLeer = true;
						break;						
				}	
				if(!terminoLeer)
					archivo=in.readLine();
			}
			for(int i=0;i<tableroPrevio.size();i++)
				tableroPrevio.get(i).trim();
	
		esCorrectoElArchivo=analizarTablero(tableroPrevio);						
		}catch(IOException e){
			throw new ClashExcepcion(ClashExcepcion.ARCHIVO_NO_VALIDO);
		}
		System.out.print(fichas);
		return esCorrectoElArchivo;
	}
		
	private static String readInLines(String subarchivo, BufferedReader in) throws ClashExcepcion, IOException {
		subarchivo=in.readLine();
		while(subarchivo.charAt(1)== ' '){
			try {
				
				Class.forName("aplicacion."+subarchivo.substring(2));
				fichas.put(subarchivo.substring(0,1), subarchivo.substring(2));
			} catch (ClassNotFoundException c) {
				throw new ClashExcepcion(ClashExcepcion.CLASE_NO_EXISTE+c.getMessage());
			}
			subarchivo=in.readLine();
		}
	
		return subarchivo;
	}	

		
	private static boolean analizarTablero(ArrayList<String> tableroPrevio) throws ClashExcepcion {
		boolean estaCorrecto=true;
			estaCorrecto=dimensiones(tableroPrevio);
			if(!estaCorrecto){
				throw new ClashExcepcion(ClashExcepcion.DIMENSIONES_INCORRECTAS);
			}
			//estaCorrecto=noFormacionesAtaque();			
			//estaCorrecto=noFormacionesDefensa();
			for(int i=1; i<tableroPrevio.size()-1 && estaCorrecto;i++){
				int count=1;
				for(int j=1; j<tableroPrevio.get(j).length()-1 && estaCorrecto;j++){
					if(tableroPrevio.get(i).charAt(j)==tableroPrevio.get(i).charAt(j+1) && tableroPrevio.get(i).charAt(j)!=' ' && tableroPrevio.get(i).charAt(j)!='M'){
						count++;
					}
					else
						count=1;
					if(count>=3){
						estaCorrecto=false;
						}
				}
			}				
			for(int j=1; j<tableroPrevio.get(j).length() -1 && estaCorrecto;j++){			
				int count=1;
				for(int i=1; i<tableroPrevio.size()-1 && estaCorrecto;i++){
 					if(tableroPrevio.get(i).charAt(j)==tableroPrevio.get(i+1).charAt(j))
						count++;
					else
						count=1;
					if(count>=3){
						estaCorrecto=false;
					}					
				}
			}

		return estaCorrecto;
	}

	private static boolean dimensiones(ArrayList<String> tableroPrevio) {
		boolean estaCorrecto=true;
		int tamanoFilas=tableroPrevio.get(0).length();
		
		for(int i=1;i<tableroPrevio.size() && estaCorrecto ; i++){
			if(tamanoFilas!=tableroPrevio.get(i).length()){
				estaCorrecto=false;
			}
		}
		
		//if(!(esLimite(tableroPrevio.get(tableroPrevio.size()/2)) && esLimite(tableroPrevio.get(tableroPrevio.size()))&& esLimite(tableroPrevio.get(0)))){
		//	estaCorrecto=false;
		//}
		return estaCorrecto;
	}


	private static boolean esLimite(String string) {
		boolean estaCorrecto=true;
			for(int i=0;i<string.length();i++){
				estaCorrecto=(string.charAt(i)==M?true:false);
			}
		return estaCorrecto;
	}
	
	public static Tablero[] cargarTablero(){
		Tablero[] tablero=new Tablero[ClashOfPOOB.NUMERO_JUGADORES];
		
		ArrayList<ArrayList<Fichas>> fichas=new ArrayList<ArrayList<Fichas>>();
		//construir matriz de fichas 1, es decir entre las lineas 1 y (size/2)-1
		tablero[0] = new Tablero((tableroPrevio.size()/2)-1,tableroPrevio.size());
        for(int i=0; i<tableroPrevio.size(); i++){
        	for (int j=0; j<tableroPrevio.get(i).length();j++){
        		if(tableroPrevio.get(i).charAt(j) != ' ')
        			tablero[0].adicionarFicha(new Fichas(i,j), i, j);
        	}
        	
        }	
		//construir matriz de fichas 2, es decir entre las lineas (size/2)+1 y size-1
        tablero[1] = new Tablero((tableroPrevio.size()/2)-1,tableroPrevio.size());
        for(int i=tableroPrevio.size()/2+1; i<tableroPrevio.size(); i++){
        	for (int j=0; j<tableroPrevio.get(i).length();j++){
        		if(tableroPrevio.get(i).charAt(j) != ' ')
        			tablero[1].adicionarFicha(new Fichas(i,j), i, j);
        	}
        	
        }	
		return tablero;		
	}
	
	public boolean guardarJuego(String path,ClashOfPOOB clashOfPOOB) throws ClashExcepcion{
		//Escribr el codigo para guardar el juego
		boolean guarde = true; 
		try{
			ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(path+".dat")); 
			out.writeObject(clashOfPOOB);
			out.close(); 
		}catch(IOException io){
			guarde = false; 
			throw new ClashExcepcion("IOException: ");
			
		}
		return guarde;
	}
	/*
	public static void guarde(File f, board b) throws ClashExcepcion{
	
		try{
		    ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(f+".dat"));
		    out.writeObject(b);
		    out.close();
		}catch(IOException io){
			throw new ClashExcepcion("IOExcpetion: ");
		}
	}
	public static board abra(File f)  throws ClashExcepcion{
		 
		board b; 
		try{
			ObjectInputStream in = new ObjectInputStream(new FileInputStream(f));		
			b = (board)in.readObject();
			in.close();
		}catch(ClassNotFoundException cnf){
			throw new ClashExcepcion("Abra: ");
		}catch(IOException io){
			throw new ClashExcepcion("Abra: ");
		}	
		return b;
	}
	
	public static board importe (File f) throws ClashExcepcion{
		board b = null;
		
	    try{	
			BufferedReader br = new BufferedReader(new FileReader(f));
			String line = br.readLine();
			while(line != null){
				String[] readed = line.split(" ");
				line=br.readLine();
			}
	    }catch(Exception e){
			throw new ClashExcepcion("Guarde: ");
		}
	    return b; 	
	}
	*/
}
	
	
	
	

